#include <stdio.h>

#define N 40

int mystrlen(const char *str);

char *mystrncpy(char *dest, const char *src, int n); 

char *mystrncat(char *dest, const char *src, int n);


int main(void)
{
    char str1[N] = "Hello World!";
    char str2[N] = "My Test Str";

    printf("str1 len = %d\n", mystrlen(str1));
    printf("str2 len = %d\n", mystrlen(str2));

    // cpy 或者 cat 都有可能超过 char[] 的最大容量
    printf("cpy str2 to str1: %s\n", mystrncpy(str1, str2, 11));

    printf("cat str2 to str1: %s\n", mystrncat(str1, str2, 7));

    return 0;
}


/* 计算字符串 str 的长度，直到空结束字符，但不包括空结束字符。 
 * 
 * 返回值：str 的长度。
 */
int mystrlen(const char *str)
{
    int len;

    for (len = 0; str[len] != '\0'; len++);

    return len;
}

/* 把 src 所指向的字符串复制到 dest，最多复制 n 个字符。
 * 当 src 的长度小于 n 时，dest 的剩余部分将用空字节填充。
 * 
 * 返回值：最终复制的字符串。
 */
char *mystrncpy(char *dest, const char *src, int n)
{
    int i;
    for (i = 0; i < n && src[i] != '\0'; i++)
        dest[i] = src[i];
    while (i <= n) // 注意此处改成了 i <= n 而不是 i < n 这保证在字符串的末尾至少加上一个终止符
        dest[i++] = '\0';

    return dest;
}

/* 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾，直到 n 字符长度为止。
 *
 * 返回值：一个指向最终的目标字符串 dest 的指针。
 */
char *mystrncat(char *dest, const char *src, int n)
{
    int len = mystrlen(dest);
    int i;
    for (i = 0; i < n && src[i] != '\0'; i++)
        dest[len + i] = src[i];
    dest[len + i] = '\0'; // 补充结束符

    return dest;
}

